package com.qf.provider.api.common.protocol.http;


import com.qf.provider.api.common.Invocation;
import com.qf.provider.api.common.LocalRegister;
import org.apache.commons.io.IOUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.lang.reflect.Method;

/**
 * @author Thor
 * @公众号 Java架构栈
 */
public class HttpServerHandler {

    public void handler(HttpServletRequest req, HttpServletResponse resp) {
        // debug启动提供者时，当消费者访问则会在此处断点停住
        try {
            // 获取输入流
            ObjectInputStream ois = new ObjectInputStream(req.getInputStream());
            // 传输层传输 Invocation对象（TCP通道中）
            Invocation invocation = (Invocation)ois.readObject();
            // 获取服务接口
            String interfaceName = invocation.getInterfaceName();//HelloService
            // 通过接口名称，从本地注册中心中，获取实现类
            Class implClass = LocalRegister.get(interfaceName);//HelloServiceImpl.hello(String name)
            // 拿到方法
            Method method = implClass.getMethod(invocation.getMethodName(), invocation.getParamTypes());
            // 反射调用 相应 实例中 的 方法
            String result = (String) method.invoke(implClass.newInstance(), invocation.getParams());//HelloServiceImpl.hello(String name)
            System.out.println("tomcat:" + result);
            // 写回给服务的消费者
            IOUtils.write(result.getBytes(), resp.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
